/********************************************
 * 功能说明: 
 * 模块名称: 
 * 系统名称: 
 * 软件版权: 西安华信智慧数字科技有限公司
 * 系统版本: 1.0.0
 * 开发人员: zhangfb
 * 开发时间: 2020/3/1 21:24
 * 审核人员: 
 * 相关文档: 
 * 修改记录: 修改日期 修改人员 修改说明
 *********************************************/
package com.hyacinth.cloudnote.modules.common.config;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.hyacinth.cloudnote.common.security.MD5PasswordEncoder;
import com.hyacinth.cloudnote.common.security.PasswordEncoder;
import com.hyacinth.cloudnote.common.security.UserPrincipal;
import com.hyacinth.cloudnote.common.utils.CryptoForToken;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.TimeUnit;

/**
 * 应用配置
 * @author zhangfb
 * @version 1.0.0.1
 * @since 2020/3/1 21:24
 */
@Configuration
@EnableConfigurationProperties(AppProperties.class)
public class AppConfiguration {

    @Autowired
    private AppProperties appProperties;

    /**
     * 初始化密码加密器
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new MD5PasswordEncoder();
    }

    /**
     * 初始化TOKEN加密器
     */
    @Bean
    public CryptoForToken cryptoForToken() {
        return new CryptoForToken(appProperties.getToken().getSecret());
    }

    /**
     * 初始化token本地缓存
     * @return token本地缓存
     */
    @Bean("tokenLocalCache")
    public Cache<String, UserPrincipal> buildTokenCache() {
        int timeout = appProperties.getToken().getExpirationInMs();
        // 通过CacheBuilder构建一个缓存实例
        return CacheBuilder.newBuilder()
                // 设置缓存的最大容量
                .maximumSize(1000)
                // 设置失效时间为JWT的失效时间
                .expireAfterWrite(timeout, TimeUnit.MILLISECONDS)
                // 并发数为cpu核心进程数
                .concurrencyLevel(Runtime.getRuntime().availableProcessors())
                // 开启缓存统计
                .recordStats()
                .build();
    }
}
